﻿////14.	Заполнить квадратную матрицу размером N x M по спирали.
//		Число 1 ставится в центр матрицы, а затем массив
//		заполняется по спирали против часовой стрелки
//		значениями по возрастанию.
//================================
//
//Write by Artur Ataev (STEP-ODESA-14.01.2014)
//mail: art.post.ua@gmail.com

using System;

namespace array_14
{
	class Program
	{
		static int x;
		static int y;
		static int rule;

		static int x_min;
		static int x_max;
		static int y_min;
		static int y_max;
		
		static int S_cur = 0;
		static int S_prev = 0;
		
		static void Main(string[] args)
		{
			Console.Clear();
			Console.WriteLine("Введіть розмір квадраної матриці : ");
			int size = Convert.ToInt32(Console.ReadLine());
			if (size%2 == 0) ++size;
			
			int [ , ] matrix;
			matrix = new int [size, size];
			
			int mid = (int)(size / 2);
			x = mid;
			y = mid;
			
			x_min = x;
			x_max = x;
			y_min = y;
			y_max = y;
			
			rule= 3; // початковий напраямок  (0-вверх) (1-вліво) (2-вниз) (3-вправо)
			
			for (int i= 0; i< size*size; ++i)
			{
				matrix[y, x]= i+1;
				Console.Clear();
			//	Console.WriteLine("x= {0}, y= {1}, rule= {2}, S_prev= {3}, S_cur= {4}", x, y, rule, S_prev, S_cur);
			//	Console.WriteLine("x_min= {0}, x_max= {1}, y_min= {2}, y_max= {3}", x_min, x_max, y_min, y_max);
				ShowMatrix(matrix);
				Console.ReadKey();
			
				Next_Coord(Next_Way());
			}
			ShowMatrix(matrix);
			Console.ReadKey();			
        }
   
    
    static void ShowMatrix(int [,] matrix)
    {
		for (int i= 0; i< matrix.GetLength(0); ++i)
		{
			for (int j= 0; j< matrix.GetLength(1); ++j)
			{
				Console.Write(matrix[i,j].ToString().PadLeft(4, ' '));
			}
			Console.WriteLine();
		}
    }
	
	static void Next_Coord (bool vector)
	{
		if (vector == true)
		{
			++rule;
			rule %= 4;
		}
			
		switch (rule)
		{
		case 0:
			++x;
		break;
		case 1:
			--y;
		break;
		case 2:
			--x;
		break;
		case 3:
			++y;
		break;
		}
	}
	
	static bool Next_Way()
	{
		x_min = Math.Min(x_min, x);
		x_max = Math.Max(x_max, x);
		y_min = Math.Min(y_min, y);
		y_max = Math.Max(y_max, y);
		
		S_cur = ((x_max - x_min)+1) * ((y_max - y_min)+1);
		
		bool result = false;
		if (S_cur > S_prev) result = true;
		
		S_prev = S_cur;
		return result;	
	}

	
	static int Fibonachi(int count)
	{
		if (count < 1)
		{
			return 0;
		}
		if (count == 1)
		{
			return 1;
		}
		return (Fibonachi(count-2) + Fibonachi(count-1));
	}	
    
	}
	
}

